package permute_combine

import (
	C "gitee.com/ljfirst/algo-go-sdk/common/constant"
	"gitee.com/ljfirst/algo-go-sdk/src/algorithm/math_sdk"
)

/**
 * @author ljfirst
 * @version V1.0
 * @date 2023/9/12 23:48
 * @author-Email ljfirst@mail.ustc.edu.cn
 * @blogURL https://blog.csdn.net/ljfirst
 * @description 求数组的所有子数组之和
 **/
type SubArraySum struct {
}

func (m *SubArraySum) Method(array []int) int {
	if len(array) == 0 {
		return 0
	}
	mathTools := math_sdk.Math{}
	sum := mathTools.Sum(array...)
	power := mathTools.Power(2, len(array)-1)
	return sum * power
}

func (m *SubArraySum) GetAttribute() *C.Attribute {
	return &C.Attribute{
		Tags: []string{},
		Desc: &C.Desc{
			Name:        "SubArraySum",
			NameCn:      "求数组的所有子数组之和",
			Description: "求数组的所有子数组之和",
			Tips:        "sum=每个元素在子数组出现的次数*每个元素的值，其中每个元素在所有子数组出现的次数是相等的，等于2的(n-1)次方" +
				"【推理：(a,b,c)的所有子数组共2的3次方-1个，(a,b)的所有子数组共2的2次方-1个，所以含有c的子数组是2的(n-1)次方】",
			ParamsDesc: map[string]string{
			},
			Example: map[int]string{
			},
		},
	}
}
